package com.example.smartagrisys.common.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 文件工具类
 */
@Slf4j
@Component
public class FileUtil {

    @Value("${file.upload.path:/tmp/uploads/}")
    private String uploadPath;

    @Value("${file.access.path:/file/}")
    private String accessPath;

    /**
     * 上传文件
     *
     * @param file 文件
     * @param dir 目录
     * @return 文件访问URL
     */
    public String uploadFile(MultipartFile file, String dir) throws IOException {
        // 获取上传目录的绝对路径
        String rootPath = new File(uploadPath).getAbsolutePath();
        log.info("上传根目录的绝对路径: {}", rootPath);

        // 创建目录
        String dateDir = new SimpleDateFormat("yyyyMMdd").format(new Date());
        String uploadDir = rootPath + File.separator + dir + File.separator + dateDir;
        log.info("文件将上传到目录: {}", uploadDir);
        
        // 确保目录存在
        File dirFile = new File(uploadDir);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }
        
        // 生成文件名
        String originalFilename = file.getOriginalFilename();
        String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
        String filename = UUID.randomUUID().toString().replace("-", "") + extension;
        
        // 上传文件
        File targetFile = new File(dirFile, filename);
        file.transferTo(targetFile);
        log.info("文件已保存到: {}", targetFile.getAbsolutePath());
        
        // 返回可访问的路径
        return accessPath + dir + "/" + dateDir + "/" + filename;
    }

    /**
     * 删除文件
     *
     * @param fileUrl 文件URL
     * @return 是否成功
     */
    public boolean deleteFile(String fileUrl) {
        if (fileUrl == null || fileUrl.isEmpty()) {
            return false;
        }

        try {
            // 从文件访问路径解析出实际的文件路径
            if (fileUrl.startsWith(accessPath)) {
                String relativePath = fileUrl.substring(accessPath.length());
                Path rootPath = getUploadRootPath();
                Path filePath = rootPath.resolve(relativePath);
                
                if (Files.exists(filePath)) {
                    return Files.deleteIfExists(filePath);
                }
            }
        } catch (IOException e) {
            log.error("删除文件失败：", e);
        }
        
        return false;
    }
    
    /**
     * 获取上传根目录的绝对路径
     */
    private Path getUploadRootPath() {
        String path = uploadPath;
        
        // 如果以./开头，则基于当前用户目录处理
        if (path.startsWith("./")) {
            path = System.getProperty("user.dir") + path.substring(1);
        } 
        // 如果不是绝对路径，则基于用户目录创建绝对路径
        else if (!path.startsWith("/") && !path.matches("^[A-Za-z]:\\\\.*")) {
            path = System.getProperty("user.dir") + File.separator + path;
        }
        
        Path rootPath = Paths.get(path);
        log.info("上传根目录的绝对路径: {}", rootPath.toAbsolutePath());
        return rootPath;
    }
} 